package muhnes.sizoo.dal;

import java.util.List;
import muhnes.sizoo.HibernateUtilZoologia;
import muhnes.sizoo.modelo.Familia;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 * Clase que implementa los metodos definidos en FamiliaDao
 * @author Ricardo Orellana
 */
public class FamiliaDaoImpl extends GenericoDAO< Familia, Integer >  
                            implements FamiliaDao{
    
    public FamiliaDaoImpl() {
        super( HibernateUtilZoologia.getSessionFactory() );
    }
    
    @Override
    protected Class<?> getClaseEntidad () {
        return Familia.class;
    }
    
    /**
     * Metodo que devuelve una lista de familias que se encuentra habilitadas
     *  
     */
    @Override
    public List< Familia > buscarHabilitados () {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Familia where habilitado = 'true'";
        Query consulta = sesion.createQuery( hql );
        List< Familia > entidades = consulta.list();
        return entidades;
    }

    /**
     * Metodo que verifica que las familias sean unicas
     * 
     */
    @Override
    public boolean verificarUnicidad(Familia entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Familia where codigofamilia != :codigo " +
                     "and (upper(nombre) = :nombre " +
                     "and upper(subfamilia) = :subfamilia " +
                     "and upper(tribu) = :tribu)";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo", entidad.getCodigofamilia());
        consulta.setParameter("nombre", entidad.getNombre().toUpperCase());
        consulta.setParameter("subfamilia", entidad.getSubfamilia().toUpperCase());
        consulta.setParameter("tribu", entidad.getTribu().toUpperCase());
        return consulta.uniqueResult() != null ? true : false;
    }
    
    /**
     * Metodo que verifica que la entidad sea independiente de otras entidades.
     *  
     */
    @Override
    public boolean verificarDependencia (Familia entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Genero where familia.codigofamilia = :codigo";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo",entidad.getCodigofamilia());
        return !consulta.list().isEmpty();
    }

}
